package com.sisgesbyte.services.proyeccion;

import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.ArrayList;
import java.util.List;

import javax.ejb.EJB;
import javax.ejb.Stateless;
import javax.inject.Inject;

import com.sisgesbyte.common.ConstProyeccion;
import com.sisgesbyte.common.ConstantesInternasSistema;
import com.sisgesbyte.common.Validaciones;
import com.sisgesbyte.dao.beanDao.FiltrosBean;
import com.sisgesbyte.dao.beanDao.FiltrosSQLBean;
import com.sisgesbyte.dao.proyeccion.ManProyeccionCategoriaProdDao;
import com.sisgesbyte.dao.proyeccion.MantBandaProyeccionDao;
import com.sisgesbyte.dao.ventas.ConsultaVentasDao;
import com.sisgesbyte.data.entity.proyeccion.BandaProyeccionEntity;
import com.sisgesbyte.data.entity.proyeccion.ProyeccionCategoriaGeneralEntity;
import com.sisgesbyte.data.entity.proyeccion.ProyeccionCategoriaProdEntity;
import com.sisgesbyte.data.entity.ventas.VentasEntity;
import com.sisgesbyte.services.administracion.MantenimientoCategoriaProd;
import com.sisgesbyte.services.proyeccion.bean.AvanceCategoriaProductoBean;
import com.sisgesbyte.services.proyeccion.bean.AvanceProyCategoriaProdResponse;

@Stateless
public class ProyeccionCategoriaProductoServiceImpl implements
		ProyeccionCategoriaProductoService {

	
	@EJB
	private ManProyeccionCategoriaProdDao proyeccionCategoriaProdDao;
	@EJB
	private ConsultaVentasDao consultaVentasDao;
	@EJB
	private MantenimientoCategoriaProd mantenimientoCategoriaProd;
	@EJB
	private MantBandaProyeccionDao mantBandaProyeccionDao;
	@Inject
	private Validaciones validaciones;
	
	@Override
	public AvanceProyCategoriaProdResponse listaCatProdAvance(String codTransaccion,FiltrosSQLBean cadenaFiltros,int idPeriodo) {
		String mensajeTransaccionMetodo = "[listaCatProdAvance idTx=" + codTransaccion + "] - ";
		AvanceProyCategoriaProdResponse response = new AvanceProyCategoriaProdResponse();
		
		List<ProyeccionCategoriaGeneralEntity> proyGeneralCategoria = null;
		
		try{
			response.setIdTransaccion(codTransaccion);
			try{
				System.out.println("//1.- obtener la proyeccion total por categoria");
				//1.- obtener la proyeccion total por categoria
				proyGeneralCategoria = proyeccionCategoriaProdDao.listaProyeccionCategoriaGeneral();
			}catch(Exception e){
				System.out.println(mensajeTransaccionMetodo + "Hubo un error al listar de  BD " + e);
				response.setCodigoRespuesta(ConstProyeccion.PROYECCION_LISTAR_COD_IDT);
				response.setMensajeRespuesta(ConstProyeccion.PROYECCION_LISTAR_MSJ_IDT);
				return response;
			}
			
			if(proyGeneralCategoria.size()> 0){
				List<AvanceCategoriaProductoBean> listCategoria = new ArrayList<AvanceCategoriaProductoBean>();
					for(ProyeccionCategoriaGeneralEntity lista :proyGeneralCategoria){
							
							AvanceCategoriaProductoBean bean = new AvanceCategoriaProductoBean();
											
							List<VentasEntity> listaVentasCategoria =null;
							try{
								FiltrosSQLBean filtroSQL = new FiltrosSQLBean();
								List<Object> valores = new ArrayList<>();
								List<FiltrosBean> filtro = new ArrayList<FiltrosBean>();
								FiltrosBean listaCampo = new FiltrosBean();
								List<String> campo = new ArrayList<String>();
								campo.add("categoria_producto_id");
								listaCampo.setCampos(campo);
								listaCampo.setOperador("=");
								filtro.add(listaCampo);
								System.out.println("Id categoria: " + lista.getCategoria_producto_id());
								valores.add(lista.getCategoria_producto_id());
								filtroSQL.setListaFiltros(filtro);
								filtroSQL.setListaValores(valores);
								System.out.println("//2.- Obtenemos la suma de ventas general de la categoria");
								//2.- Obtenemos la suma de ventas general de la categoria
								listaVentasCategoria = consultaVentasDao.listaVentasDetalle(filtroSQL);
							}catch(Exception e){
								System.out.println(mensajeTransaccionMetodo + "Hubo un error al listar las ventas de  BD " + e);
								response.setCodigoRespuesta(ConstProyeccion.PROYECCION_LISTAR_COD_IDT);
								response.setMensajeRespuesta(ConstProyeccion.PROYECCION_LISTAR_MSJ_IDT);
								return response;
							}
								System.out.println("listaVentasCategoria : "+listaVentasCategoria.size());
								BigDecimal totalVentaGeneral = BigDecimal.ZERO;
								BigDecimal totalVentaPerido = BigDecimal.ZERO;
							for(VentasEntity ls :listaVentasCategoria){
								totalVentaGeneral = totalVentaGeneral.add(ls.getTotal());
								System.out.println("total venta general : " +totalVentaGeneral);
								System.out.println("//obtenemos las ventas por periodo");
								//obtenemos las ventas por periodo
								if(ls.getPeriodo_id() == idPeriodo){
									totalVentaPerido=totalVentaPerido.add(ls.getTotal());
									System.out.println("Total venta periodo :" + totalVentaPerido);
								}
							}
							
							List<ProyeccionCategoriaProdEntity> listaPriyeccioncategoria =null;
							
							try{
								FiltrosSQLBean filtroSQL = new FiltrosSQLBean();
								List<Object> valores = new ArrayList<>();
								List<FiltrosBean> filtro = new ArrayList<FiltrosBean>();
								
								FiltrosBean listaCampo = new FiltrosBean();
								List<String> campo = new ArrayList<String>();
								campo.add("pcp.categoria_producto_id");
								listaCampo.setCampos(campo);
								listaCampo.setOperador("=");
								filtro.add(listaCampo);
								System.out.println("Categoria Id :" +lista.getCategoria_producto_id());
								valores.add(lista.getCategoria_producto_id());
								
								FiltrosBean listaCampo2 = new FiltrosBean();
								List<String> campo2 = new ArrayList<String>();
								campo2.add("pcp.periodo_id");
								listaCampo2.setCampos(campo2);
								listaCampo2.setOperador("=");
								filtro.add(listaCampo2);
								System.out.println("Id periodo : "+idPeriodo);
								valores.add(idPeriodo);
								filtroSQL.setListaFiltros(filtro);
								filtroSQL.setListaValores(valores);
								System.out.println("//3.- obtenemos la proyeccion por periodo de la categoria");
								//3.- obtenemos la proyeccion por periodo de la categoria
								listaPriyeccioncategoria = proyeccionCategoriaProdDao.listarProyeccionCategoria(filtroSQL);
							}catch(Exception e){
								System.out.println(mensajeTransaccionMetodo + "Hubo un error al listar proyeccion de categorias de  BD " + e);
								response.setCodigoRespuesta(ConstProyeccion.PROYECCION_LISTAR_COD_IDT);
								response.setMensajeRespuesta(ConstProyeccion.PROYECCION_LISTAR_MSJ_IDT);
								return response;
							}
								BigDecimal totalProyeccionPerido = BigDecimal.ZERO;
								String bandaGeneral ="";
								String bandaPeriodo ="";
							for(ProyeccionCategoriaProdEntity ls : listaPriyeccioncategoria){
								System.out.println("categoria : "+validaciones.validarCamposString(ls.getCategoria()));
								//obtenemos el moto de la proyeccion de la categoria por producto
								totalProyeccionPerido = totalProyeccionPerido.add(ls.getMonto_proyectado());
								bandaGeneral=ls.getBanda_general();
								bandaPeriodo = ls.getBanda_periodo();
								bean.setCategoria(validaciones.validarCamposString(ls.getCategoria()));
								bean.setDescripcion(validaciones.validarCamposString(ls.getDescripcion()));
								bean.setIdCategoria(ls.getCategoria_producto_id());
								bean.setIdPadre(ls.getPadre_id());
								bean.setIdPeriodo(ls.getPeriodo_id());
								bean.setIdProyeccion(ls.getId());
							}
							
							BigDecimal porcentajeAvanceGeneral= BigDecimal.ZERO; 
							
							try{
								System.out.println("//calculamos el porcentaje de avance general");
								//calculamos el porcentaje de avance general
								System.out.println("Proyeccion general: "+lista.getProyeccion_general());
								porcentajeAvanceGeneral = totalVentaGeneral.divide(lista.getProyeccion_general(),4, RoundingMode.CEILING);
							}catch(Exception e){
								System.out.println("Error al calcular porcentaje - "+e );
								porcentajeAvanceGeneral= BigDecimal.ZERO; 
							}
							
							BigDecimal porcentajeAvancePeriodo= BigDecimal.ZERO; 
							try{
								System.out.println("//calculamos el porcentaje de avance periodo");
								System.out.println("totalProyeccionPerido : "+totalProyeccionPerido);
								//calculamos el porcentaje de avance periodo
								porcentajeAvancePeriodo = totalVentaPerido.divide(totalProyeccionPerido,4, RoundingMode.CEILING);
							}catch(Exception e){
								System.out.println("Error al calcular porcentaje - "+e );
								porcentajeAvancePeriodo= BigDecimal.ZERO; 
							}
							
							//obtenemos el color de la banda General
							String colorbandaGeneral = colorBanda(bandaGeneral,porcentajeAvanceGeneral);
							String colorbandaPeriodo = colorBanda(bandaPeriodo,porcentajeAvancePeriodo);
							bean.setAvanceMontoGeneral(totalVentaGeneral);
							bean.setAvanceMontoPeriodo(totalVentaPerido);
							bean.setAvancePorcentajeGeneral(porcentajeAvanceGeneral.multiply(new BigDecimal(100)));
							bean.setAvancePorcentajePeriodo(porcentajeAvancePeriodo.multiply(new BigDecimal(100)));
							bean.setColorBandaGeneral(colorbandaGeneral);
							bean.setColorBandaPeriodo(colorbandaPeriodo);
					
					listCategoria.add(bean);
				}
				System.out.println("total : " +listCategoria );
				response.setListaCategoriaProdAvance(listCategoria);
				response.setCodigoRespuesta(ConstantesInternasSistema.CODIGO_EXITO);
				response.setMensajeRespuesta(ConstantesInternasSistema.MENSAJE_EXITO);
			}else{
				response.setCodigoRespuesta(ConstProyeccion.PROYECCION_LISTAR_COD_IDF);
				response.setMensajeRespuesta(ConstProyeccion.PROYECCION_LISTAR_MSJ_IDF);
			}
		}catch(Exception e){
			System.out.println(mensajeTransaccionMetodo + "Hubo un error en el proceso " + e);
			response.setCodigoRespuesta(ConstantesInternasSistema.CIUDAD_LISTAR_COD_IDT65);
			response.setMensajeRespuesta(ConstantesInternasSistema.CIUDAD_LISTAR_MSJ_IDT65);
			return response;
		}
		return response;
	}
	
public String colorBanda(String codBanda,BigDecimal porcentaje){
	String color ="";
		try{
			
		List<BandaProyeccionEntity> listaBandas = null;
		 try{
			 FiltrosSQLBean cadenaFiltros = new FiltrosSQLBean();
			 List<FiltrosBean> listaFiltros = new ArrayList<FiltrosBean>();
			 FiltrosBean filtroCampos = new FiltrosBean();
			 List<String> campos = new ArrayList<String>();
			 campos.add("codigo");
			 filtroCampos.setCampos(campos);
			 filtroCampos.setOperador("=");
			 listaFiltros.add(filtroCampos);
			 List<Object> valores = new ArrayList<Object>();
			 valores.add(codBanda);
			 cadenaFiltros.setListaFiltros(listaFiltros);
			 cadenaFiltros.setListaValores(valores);
			 listaBandas = mantBandaProyeccionDao.listaBandasProyeccion(cadenaFiltros);
		}catch(Exception e){
			System.out.println("Error al Obtener las bandas: " + e);
		}
		 List<BigDecimal> bandas = new ArrayList<BigDecimal>();
		 if(listaBandas.size() > 0 && listaBandas!= null){
			 BigDecimal suma = BigDecimal.ZERO;
			 for(BandaProyeccionEntity ls : listaBandas){
				 suma = suma.add(ls.getPorcentaje());
				 bandas.add(suma);
			 }
		 }
	
		int i=0;
		for(BigDecimal ls :bandas ){
			++i;
			if(porcentaje.compareTo(ls) == -1){
				break;
			}
		}
		
		switch(i){
		case 1:
			color = "rojo";
			break;
		case 2:
			color = "amarillo";
			break;
		case 3:
			color = "verde";
			break;
		}
		
		}catch(Exception e){
			System.out.println("Error en el proceso para capturar el color de la Banda - " + e);
			color="";
		}
		return color;
	}
		
}
